package server;

import java.io.*;
import java.sql.SQLException;

import server.json.*;
import server.SqlClass;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.microsoft.sqlserver.jdbc.SQLServerException;

/**
 * Servlet implementation class Servlet
 */
@WebServlet("/Servlet")
public class Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.processRequest(request, response);
	}
	private void processRequest (HttpServletRequest req, HttpServletResponse resp) throws IOException{
        InputStream is = req.getInputStream();
        PrintWriter pw = resp.getWriter();
        JSONTokener jt;
		try {
			jt = new JSONTokener(is);
            JSONObject jo = new JSONObject(jt);            
            String operation = jo.getString("op_request");
            String message = jo.getString("op_message");
            String email = jo.getString("op_username");
            log("processRequest(...) - Operazione: "+operation+", Messaggio: "+message+", Richiedente: "+email);
            log("Trying connect to server: PC-BOSTICCOC, DB: adb_fars, user: sa");
            SqlClass conn = new SqlClass("sa","swazikomsu14","PC-BOSTICCOC","spazioidro");
            conn.connect();
            if (operation.equals("select_ar")){
                JSONObject rj = conn.select_ar(message,email);
                log("processRequest(...) - Pacchetto di risposta per 'select_ar("+message+")' inviato");
                pw.print(rj);
            }
            else if (operation.equals("select_novita")){
                JSONArray rj = conn.select_novita(email);
                log("processRequest(...) - Pacchetto di risposta per 'select_novita' inviato ("+rj.length()+" articoli elaborati)");
                pw.print(rj);
            }
            else if (operation.equals("select_ar_alias")){
                JSONObject rj = conn.selectArAlias(message,email);
                log("processRequest(...) - Pacchetto di risposta per 'select_ar_alias' inviato )");
                pw.print(rj);
            }
            else if (operation.equals("search_by_key")){
                long startTime = System.currentTimeMillis();
                JSONArray rj = conn.searchByKey(message,email);
                long endTime = System.currentTimeMillis();
                log("processRequest(...) - Pacchetto di risposta per 'search_by_key' inviato ("+rj.length()+" articoli elaborati). Tempo richiesto: "+(endTime-startTime)+" ms");
                pw.print(rj);
            }
            else if (operation.equals("user_login")){
                JSONObject rj = conn.user_login(jo.getString("email"),jo.getString("password"));
                log("processRequest(...) - Pacchetto di risposta per 'user_login' inviato");
                pw.print(rj);
            }
            else if (operation.equals("select_carrello")){
                JSONArray rj = conn.selectCarrello(email);
                log("processRequest(...) - Pacchetto di risposta per 'select_carrello' inviato ("+rj.length()+" articoli elaborati)");
                pw.print(rj);
            }
            else if (operation.equals("save_carrello")){
                conn.salvaCarrello(email, jo.getJSONArray("array_cart"));
                log("processRequest(...) - Salvataggio del carrello per '"+email+"' effettuato");
                pw.print(new JSONObject ());
            }
            else if (operation.equals("update_articles")){
                JSONArray rj = conn.updateArticles(email);
                log("processRequest(...) - Update degli articoli per '"+email+"' effettuato ("+rj.length()+" articoli elaborati)");
                pw.print(rj);
            }
            else if (operation.equals("get_destinazioni")){
                JSONArray res = conn.getDestinazioni(email);
                log("processRequest(...) - Recupero elenco destinazioni per '"+email+"' effettuato ("+res.length()+" destinazioni trovate)");
                pw.print(res);
            }
            else if (operation.equals("get_nazioni")){
                JSONArray res = conn.getNazioni();
                log("processRequest(...) - Recupero elenco nazioni per '"+email+"' effettuato ("+res.length()+" nazioni trovate)");
                pw.print(res);
            }
            else if (operation.equals("get_province")){
                JSONArray res = conn.getProvince();
                log("processRequest(...) - Recupero elenco province per '"+email+"' effettuato ("+res.length()+" province trovate)");
                pw.print(res);
            }
            else if (operation.equals("verifica_cap")){
                String cap = jo.getString("cap");
                String codProvincia = jo.getString("codProvincia");
                JSONObject res = conn.verificaCap(cap, codProvincia);
                log("processRequest(...) - Recupero elenco province per '"+email+"' effettuato ("+res.length()+" province trovate)");
                pw.print(res);
            }
            //JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
            //String query = object.getString("food");
            //	JSONArray locations = object.getJSONArray("locations");
            pw.flush();
		} catch (JSONException e) {
			log("processRequest(...) - ERRORE: Oggetto JSON non valido");
			e.printStackTrace();
		} catch (SQLServerException e) {
			log("processRequest(...) - ERRORE: Impossibile stabilire la connessione al Server SQL");
			e.printStackTrace();
		} catch (SQLException e) {
			log("processRequest(...) - ERRORE: Impossibile eseguire la query select_ar(...)");
			e.printStackTrace();
		}
    }
}
